package Day_0131.JVM;

/**
 * @author zxc
 * @date 2023/01/31 20:31
 **/
public class Object_Structure {
    public static void main(String[] args) {
        /**
         * Java对象结构
         * Java对象由三个部分组成：对象头、实例数据、对齐填充。
         * 1.对象头
         * 对象头由两部分组成;
         * （1）第一部分存储对象自身的运行时数据：哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID（一般占32/64 bit）。
         * （2）第二部分是指针类型，指向对象的类元数据类型（即对象代表哪个类）。
         * 注意 ：如果是数组对象，则对象头中还有一部分用来记录数组长度。
         *
         * 2.实例数据
         * 实例数据用来存储对象真正的有效信息（包括父类继承下来的和自己定义的）
         *
         * 3.对齐填充
         * 对齐填充：JVM要求对象起始地址必须是8字节的整数倍（8字节对齐）
         */

        /**
         * 如何判断某个Java对象是否可以被垃圾回收？
         *
         * 1.引用计数：
         * 每个对象有一个引用计数属性，新增一个引用时计数加1，引用释放时计数减1，计数为0时可以回收。
         * 此方法简单，无法解决对象相互循环引用的问题。
         *
         * 2.可达性分析（Reachability Analysis）：
         * 从GC Roots开始向下搜索，搜索所走过的路径称为引用链。
         * 当一个对象到GC Roots没有任何引用链相连时，则证明此对象是不可用的，不可达对象。
         */

        /**
         * 永久代是否可以被垃圾回收？
         * 结论 ：永久代是可以进行垃圾回收的;
         *
         * 1.该类的实例都被回收;
         * 2.加载该类的classLoader已经被回收;
         * 3.该类不能通过反射访问到其方法，而且该类的java.lang.class没有被引用
         * ===> 即，满足以上三个条件的话，永久代的类元数据也是可以被垃圾回收的;
         */
    }
}
